﻿#include <iostream>

using namespace std;
/* 对象行为型模式
1.意图
定义一系统的算法，把它们一个个封装起来，并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
2.别名
策略（Policy）
3.适用性
当存在以下情况时使用Strategy模式：
a.许多相关的类仅仅是行为有异。策略提供了一种用多个行为中的一个行为来配置一个类的方法
b.需要使用一个算法的不同变体。
c.算法使用客户不应该知道的数据。可使用策略模式以避免暴露复杂的、与算法相关的数据结构
d.一个类定义了多种行为，并且这些行为在这个类的操作中以多个条件语句的形式出现。将相关的条件分支移入它们各自的Strategy类中以
代替这些条件语句。
*/
class Strategy
{
public:
	virtual int Execute(int left, int right) = 0;
};
class Add:public Strategy
{
public:
	int Execute(int left, int right)
	{
		return left + right;
	}
};
class Sub :public Strategy
{
public:
	int Execute(int left, int right)
	{
		return left - right;
	}
};
class Mul :public Strategy
{
public:
	int Execute(int left, int right)
	{
		return left * right;
	}
};
class Div :public Strategy
{
public:
	int Execute(int left, int right)
	{
		if (right != 0)
		{
			return left / right;
		}
		else
		{
			cout << "除数不能为0" << endl;
		}
	}
};
class Context
{
public:
	void SetStrategy(Strategy* pStrategy)
	{
		this->pStrategy = pStrategy;
	}
	int ExecuteStrategy(int left, int right)
	{
		return pStrategy->Execute(left, right);
	}
private:
	Strategy* pStrategy;
};
/*
int main()
{
	Context* pContext = new Context();
	int left, right;
	char key;
	char flag = 'n';
	while (flag!='y')
	{
		cin >> left >> key >> right;
		switch(key)
		{
		case '+':
			pContext->SetStrategy(new Add);
			break;
		case '-':
			pContext->SetStrategy(new Sub);
			break;
		case '*':
			pContext->SetStrategy(new Mul);
			break;
		case '/':
			pContext->SetStrategy(new Div);
			break;
		}
		cout << pContext->ExecuteStrategy(left, right) << endl;
		cout << "是否退出（y/n）:";
		cin >> flag;
	}
	return 0;
}
*/